// ajax({
//     method: 'get',
//     url: 'http://www.example.com',
//     data: {
//         name: "admin",
//         sex: "f",
//         age: 10
//     },
//     success: function (data) {
//     	console.log(data);
// 	},
//     error: function(error){
//         console.log(error);
//     }
// })

function ajax(opt) {
  // 写好默认配置
  var _default = {
    method: "get",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data: {},
    success: function (data, xhr) {},
    error: function (err) {},
  };

  // 合并使用者的配置选项与默认选项
  //_default = {..._default, ...opt}
  Object.assign(_default, opt);

  var xhr = new XMLHttpRequest();

  // 对象装换成  查询字符串
  //  {a:1, b:1}  => a=1&b=2
  var tmp = [];
  for (var key in _default.data) {
    tmp.push(key + "=" + _default.data[key]);
  }
  var qs = tmp.join("&");

  // 判断请求方式
  // get的封装
  if (_default.method.toUpperCase() === "GET") {
    _default.url = qs ? _default.url + "?" + qs : _default.url;
    xhr.open("GET", _default.url);
    xhr.send();
  }

  // 进行post封装
  if (_default.method.toUpperCase() === "POST") {
    // 设置访问的url 请求方式
    xhr.open("POST", _default.url);

    // 设置请求头
    for (var key in _default.headers) {
      xhr.setRequestHeader(key, _default.headers[key]);
    }

    // 发送数据  form-urlencoded qs     //  application/json   json字符串
    if (_default.headers["Content-Type"].includes("application/json")) {
      xhr.send(JSON.stringify(_default.data));
    } else {
      xhr.send(qs);
    }
  }

  return new Promise((resolve, reject) => {
    // 获取响应的结果数据
    xhr.onload = function () {
      //  针对状态码 判断一下 请求是成功还是失败
      if (
        xhr.status.toString().startsWith("4") ||
        xhr.status.toString().startsWith("5")
      ) {
          reject(xhr);
        return _default.error(xhr);
      }

      var result = xhr.responseText;

      // 检查一下响应的头部 发现响应 是application/json类型的，做数据转化
      if (xhr.getResponseHeader("content-type").includes("application/json")) {
        result = JSON.parse(result);
      } 
      resolve(result)
      return _default.success(result);
    };

    // 网络异常
    xhr.onerror = function () {
      reject(xhr)
      _default.error(xhr);
    };
  });
}
